package com.duoec.dw.lineage.core.conf;

import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem;
import com.duoec.dw.lineage.exceptions.LineageAnalyseException;
import com.duoec.dw.lineage.core.utils.AnalyserUtils;
import com.duoec.dw.lineage.service.AlterTableItemAnalyser;
import com.duoec.dw.lineage.service.StatementAnalyser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import javax.annotation.PostConstruct;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author xuwenzhen
 */
@Component
public class MySqlAnalyserConfig {
    @Autowired
    private List<StatementAnalyser> statementAnalyserList;

    private Map<Class, StatementAnalyser> tableStatementAnalyserMap;

    @Autowired
    private List<AlterTableItemAnalyser> alterTableItemAnalyserList;
    protected Map<Class, AlterTableItemAnalyser> alterTableItemAnalyserMap;

    @PostConstruct
    public void init() {
        if (CollectionUtils.isEmpty(alterTableItemAnalyserList)) {
            throw new LineageAnalyseException("未实现任何AlterTableItemAnalyser接口！");
        }
        alterTableItemAnalyserMap = alterTableItemAnalyserList.stream()
                .collect(Collectors.toMap(AlterTableItemAnalyser::getType, analyser -> analyser));


        if (CollectionUtils.isEmpty(statementAnalyserList)) {
            throw new LineageAnalyseException("未实现任何TableStatementAnalyser接口！");
        }
        tableStatementAnalyserMap = statementAnalyserList.stream()
                .collect(Collectors.toMap(StatementAnalyser::getType, analyser -> analyser));
    }

    public AlterTableItemAnalyser getAlterTableItemAnalyser(SQLAlterTableItem item) {
        return AnalyserUtils.getAnalyser(item, alterTableItemAnalyserMap);
    }

    public StatementAnalyser getStatementAnalyser(SQLStatement statement) {
        return AnalyserUtils.getAnalyser(statement, tableStatementAnalyserMap);
    }

    public void setStatementAnalyserList(List<StatementAnalyser> statementAnalyserList) {
        this.statementAnalyserList = statementAnalyserList;
    }

    public void setAlterTableItemAnalyserList(List<AlterTableItemAnalyser> alterTableItemAnalyserList) {
        this.alterTableItemAnalyserList = alterTableItemAnalyserList;
    }
}
